package com.xizi.singleton;


/*
    双重检验锁实现单例模式
 */
public class Singleton {

    private volatile static Singleton uniqueInstance;

    private Singleton() {

    }

    public static Singleton getUniqueInstance() {
        //先判断对象是否已经实例过 没有实例过才进入加锁代码
        if (uniqueInstance == null) {
            //类对象加锁
            synchronized (Singleton.class) {
                if (uniqueInstance == null) {
                    // uniqueInstance=new Singleton();创建对象分三步执行
                    //1.为uniqueInstance 分配内存空间
                    //2. 初始化 uniqueInstance
                    //3. 将uniqueInstance 指向分配的内存地址
                    //使用volatile 可以禁止JVM的指令重排 保证在多线程环境下也能正常运行。
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}
